<?php
/**
 * 消息队列控制器
 * @Author   Wcj
 * @email 1054487195@qq.com
 * @DateTime 2019/7/25 16:13
 */

namespace app\index\controller;

class MessageQueue extends Base
{
    /**
     * 开启消息队列服务
     * @Author   Wcj
     * @email 1054487195@qq.com
     * @DateTime 2019/7/25 16:15
     */
    public function start()
    {
        // 要处理的队列的名称
        $queue = $this->request->post('queue', '');
        // 如果本次任务执行抛出异常且任务未被删除时，设置其下次执行前延迟多少秒，默认为0。
        $delay = $this->request->post('delay', '');
        // 系统处于维护状态时，是否仍然处理任务，并未找到相关说明。
        $force = $this->request->post('force', '');
        // 该进程允许使用的内存上限，以M为单位。
        $memory = $this->request->post('memory', '');
        // 如果队列中无任务则sleep多少秒后重新检查(work+daemon模式)或退出(listen或非daemon模式)
        $sleep = $this->request->post('sleep', '');
        // 如果任务已经超过尝试次数上限，则触发“任务尝试数超限”事件，默认为0。
        $tries = $this->request->post('tries', '');
        // 是否循环执行，如果不加该参数则该命令处理完下一个消息就退出。
        $daemon = $this->request->post('daemon', '');

        // 参数检测
        $ret = check_args(compact('queue'));
        if ($ret['code'] != 200) ajax(ERROR, $ret['msg']);

        // 命令拼接
        $command = 'php think queue:work';
        $command .= $queue ? " --queue ${queue}" : '';
        $command .= $delay ? " --delay ${delay}" : '';
        $command .= $force ? ' --force' : '';
        $command .= $memory ? " --memory ${memory}" : '';
        $command .= $sleep ? " --sleep ${sleep}" : '';
        $command .= $tries ? " --delay ${tries}" : '';
        $command .= $daemon ? ' --daemon' : '';

        $prevShell = 'cd .. && '; // 切换目录到项目根目录
        $noBlocking = ' >> /dev/null 2>&1 &'; // 非阻塞命令
        $shell = $prevShell . $command . $noBlocking; // 最终执行命令
        // 检测该命令进程是否存在
        $ret = shell_exec("ps -ef | grep -i '${command}' | grep -v grep");
        // 当此消息队列进程不存在才执行
        if (!empty($ret)) return ajax(ERROR, '已启动', $shell);
        // 执行命令
        shell_exec($shell);
        return ajax(SUCCESS, '启动成功', $shell);
    }

    /**
     * 停止所有的消息队列
     * @Author   Wcj
     * @email 1054487195@qq.com
     * @DateTime 2019/7/27 15:59
     */
    public function stop()
    {
        return ajax(SUCCESS, '停止成功', shell_exec('cd .. && php think queue:restart'));
    }
}